BioJulia系列-FMIndexes

原文戳我

  • FM-index 是经典的静态、紧凑且快速的全文检索索引方式。

  • 该包提供一个FMIndex{w,T}类型, 用来索引任意字节序列,其中:

    • w是对序列字母表编码所需的位数;

    • T是序列位置的类型;

julia

using FMIndexes

fmindex = FMIndex("abracadabra")

count("abra", fmindex) # count 函数获取匹配次数

locate("ra", fmindex) # locate 函数返回一个迭代器

localteall("ra", fmindex) # 类似于locate() |> collect

# 取回index对应的序列: restore函数
String(restore(fmindex))

julia
高效索引技巧

FMIndex(seq, σ=256; r=32, program=:SuffixArrays, mmap::Bool=false, opts...)
  • seq: 要建索引的byte序列,seq[i]应该返回UInt8类型;

  • σ: 记录序列的字母表大小, 如果DNA, 设置为4, 设置过大只会浪费时间和空间;

  • r: 序列的位置采样的长度, r越小, 定位速度越快, 但索引越大;

  • program: 设置建索引的程序, 默认使用SuffixArrays.jl包, 如果需要建索引的序列很长,建议使用 pSAscan程序;

  • mmap: 设置是否将后缀数组存储在内存中, 对于长序列的索引需要设置;

一些基础知识

后缀数组 后缀数组(sa): 后缀子字符串的排序; 名次数组(rk): 后缀数组的排序; 一个不考虑性能的实现,用来表示后缀数组的定义:
julia

seq = "aabaaaab"
suf = [seq[i:end] for i in 1:length(seq)]
sa = sortperm(suf) # 后缀数组
rk = sortperm(sa) # 名次数组

julia